home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / misc.s < prev    next >
Text File  |  1999-10-08  |  16KB  |  715 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        汎用サブルーチン/アボート処理
  4. ;        < misc.s >
  5. ;
  6. ;    $Id: misc.s,v 2.1  1999 10/ 8(Fri) 21:50:20 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    DOSCALL.MAC
  13.     .include    has.equ
  14.     .include    register.equ
  15.  
  16.     .cpu    68000
  17.     .text
  18.  
  19.  
  20. ;----------------------------------------------------------------
  21. ;    DOSコール番号移動対策
  22. getenv::
  23.     link    a6,#0
  24.     move.l    (16,a6),-(sp)
  25.     move.l    (12,a6),-(sp)
  26.     move.l    (8,a6),-(sp)
  27.     DOS    _VERNUM
  28.     cmp.w    #$020F,d0
  29.     bcc    getenv1
  30.     .dc.w    $FF53            ;DOS _GETENV (~v2.03)
  31.     bra    getenv9
  32.  
  33. getenv1:
  34.     .dc.w    $FF83            ;DOS _GETENV (v2.15~)
  35. getenv9:
  36.     unlk    a6
  37.     rts
  38.  
  39.  
  40. ;----------------------------------------------------------------
  41. ;    ロケーションカウンタ操作
  42. ;----------------------------------------------------------------
  43.  
  44. ;----------------------------------------------------------------
  45. ;    ロケーションカウンタをリセットする
  46. ;    in :---
  47. ;    out:---
  48. resetlocctr::
  49.     movem.l    d0/a0,-(sp)
  50.     lea.l    (LOCCTRBUF,a6),a0
  51.     move.w    #N_SECTIONS-1,d0
  52. resetlocctr1:
  53.     clr.l    (a0)+            ;ロケーションカウンタをクリア
  54.     dbra    d0,resetlocctr1
  55.     move.w    #N_SECTIONS-1,d0
  56. resetlocctr2:
  57.     clr.l    (a0)+            ;最適化ロケーションオフセットをクリア
  58.     dbra    d0,resetlocctr2
  59.     move.w    #N_SECTIONS-1,d0
  60. resetlocctr3:
  61.     clr.b    (a0)+            ;orgセクション番号をクリア
  62.     dbra    d0,resetlocctr3
  63.     clr.l    (LOCATION,a6)
  64.     clr.l    (LOCOFFSET,a6)
  65.     clr.b    (ORGNUM,a6)
  66.     move.b    #SECT_TEXT,(SECTION,a6)    ;textセクションにする
  67.     sf.b    (OFFSYMMOD,a6)
  68.     movem.l    (sp)+,d0/a0
  69.     rts
  70.  
  71. ;----------------------------------------------------------------
  72. ;    セクションを切り替える
  73. ;    in :d0.b=切り替えるセクション番号
  74. ;    out:---
  75. chgsection::
  76.     movem.l    d0/a0,-(sp)
  77.     move.b    (SECTION,a6),d0
  78.     beq    chgsection1        ;いままでoffsetセクションだった
  79.     lea.l    (ORGNUMBUF,a6),a0
  80.     move.b    (ORGNUM,a6),(-1,a0,d0.w)
  81.     add.w    d0,d0
  82.     add.w    d0,d0
  83.     lea.l    (LOCCTRBUF,a6),a0
  84.     move.l    (LOCATION,a6),(-4,a0,d0.w)    ;旧セクションのカウンタを待避
  85.     move.l    (LOCOFFSET,a6),(LOCOFFSETBUF-LOCCTRBUF-4,a0,d0.w)
  86. chgsection1:
  87.     move.w    (2,sp),d0
  88.     move.b    d0,(SECTION,a6)
  89.     beq    chgsection2        ;これからoffsetセクションに変更する
  90.     lea.l    (ORGNUMBUF,a6),a0
  91.     move.b    (-1,a0,d0.w),(ORGNUM,a6)
  92.     add.w    d0,d0
  93.     add.w    d0,d0
  94.     lea.l    (LOCCTRBUF,a6),a0
  95.     move.l    (-4,a0,d0.w),(LOCATION,a6)    ;新セクションのカウンタを取り出す
  96.     move.l    (LOCOFFSETBUF-LOCCTRBUF-4,a0,d0.w),(LOCOFFSET,a6)
  97. chgsection2:
  98.     movem.l    (sp)+,d0/a0
  99.     rts
  100.  
  101.  
  102. ;----------------------------------------------------------------
  103. ;    データサイズ
  104. ;----------------------------------------------------------------
  105.  
  106. ;----------------------------------------------------------------
  107. ;    データ型のサイズを得る
  108. ;    in :d0.b=データ型
  109. ;    out:d0.l=データの占めるサイズ
  110. getdtsize::
  111.     and.l    #3,d0
  112.     move.b    (dtsize_tbl,pc,d0.w),d0
  113.     rts
  114.  
  115. dtsize_tbl:
  116.     .dc.b    2,2,4,1
  117.     .even
  118.  
  119.  
  120. ;----------------------------------------------------------------
  121. ;    文字列操作
  122. ;----------------------------------------------------------------
  123.  
  124. ;----------------------------------------------------------------
  125. ;    スペース・タブをスキップする
  126. ;    in :a0=文字列へのポインタ
  127. ;    out:a0=文字列へのポインタ
  128. skipspc::
  129.     move.w    d0,-(sp)
  130. skipspc1:
  131.     move.b    (a0)+,d0
  132.     beq    skipspc2
  133.     cmp.b    #' ',d0
  134.     bls    skipspc1
  135. skipspc2:
  136.     subq.l    #1,a0
  137.     move.w    (sp)+,d0
  138. skipspc9:
  139.     rts
  140.  
  141. ;----------------------------------------------------------------
  142. ;    文字列の長さを得る
  143. ;    in :a0=文字列へのポインタ
  144. ;    out:d1.w=文字列の長さ-1
  145. strlen::
  146.     move.l    a0,-(sp)
  147.     moveq.l    #-2,d1
  148. strlen1:
  149.     addq.w    #1,d1
  150.     tst.b    (a0)+
  151.     bne    strlen1
  152.     move.l    (sp)+,a0
  153.     rts
  154.  
  155. ;----------------------------------------------------------------
  156. ;    文字列をコピーする
  157. ;    in :a1=コピー元文字列へのポインタ/a0=コピー先文字列へのポインタ
  158. ;    out:a0=コピーした文字列の終了位置
  159. strcpy::
  160.     move.b    (a1)+,(a0)+
  161.     bne    strcpy
  162.     subq.l    #1,a0
  163.     rts
  164.  
  165. ;----------------------------------------------------------------
  166. ;    ドライブ名+パス名をコピーする
  167. ;    in :a1=コピー元文字列へのポインタ/a0=コピー先文字列へのポインタ
  168. ;    out:a0=コピーした文字列の終了位置
  169. pathcpy::
  170.     move.w    d0,-(sp)
  171.     tst.b    (a1)
  172.     beq    pathcpy9
  173. pathcpy1:
  174.     tst.b    (a1)
  175.     beq    pathcpy5
  176.     moveq.l    #0,d0
  177.     move.b    (a1)+,d0
  178.     move.b    d0,(a0)+
  179.     bpl    pathcpy1
  180.   .if EUCSRC=0
  181.     cmp.b    #$E0,d0
  182.     bcc    pathcpy2
  183.     cmp.b    #$A0,d0
  184.     bcc    pathcpy1        ;半角カナの場合
  185.   .else
  186.     bra    pathcpy1        ;EUC
  187.   .endif
  188. pathcpy2:
  189.     lsl.w    #8,d0
  190.     move.b    (a1)+,d0        ;2バイト文字の2バイト目
  191.     beq    pathcpy5
  192.     move.b    d0,(a0)+
  193.     bra    pathcpy1
  194.  
  195. pathcpy5:
  196.     cmp.w    #'\',d0
  197.     beq    pathcpy9
  198.     cmp.w    #'/',d0
  199.     beq    pathcpy9
  200.     cmp.w    #':',d0
  201.     beq    pathcpy9
  202. pathcpy8:
  203.     move.b    #'\',(a0)+        ;パスの区切を追加する
  204. pathcpy9:
  205.     move.w    (sp)+,d0
  206.     rts
  207.  
  208. ;----------------------------------------------------------------
  209. ;    ドライブ+パス名からファイル名のみを取り出す
  210. ;    in :a0=ドライブ・パス名付きファイル名へのポインタ
  211. ;    out:a1=ファイル名のみへのポインタ
  212. getfilename::
  213.     move.w    d0,-(sp)
  214. getfilename1:
  215.     movea.l    a0,a1
  216.     move.b    (a0)+,d0
  217.     bmi    getfilename4
  218.     beq    getfilename3
  219.     cmp.b    #'.',d0
  220.     beq    getfilename1
  221. getfilename2:
  222.     cmp.b    #':',d0
  223.     beq    getfilename1
  224.     cmp.b    #'\',d0
  225.     beq    getfilename1
  226.     cmp.b    #'/',d0
  227.     beq    getfilename1
  228. getfilename25:
  229.     move.b    (a0)+,d0
  230.     bmi    getfilename4
  231.     bne    getfilename2
  232. getfilename3:
  233.     move.w    (sp)+,d0
  234.     rts
  235.  
  236. getfilename4:
  237.   .if EUCSRC=0
  238.     cmp.b    #$E0,d0
  239.     bcc    getfilename5
  240.     cmp.b    #$A0,d0
  241.     bcc    getfilename25        ;半角カナの場合
  242.   .else
  243.     bra    getfilename25        ;EUC
  244.   .endif
  245. getfilename5:
  246.     tst.b    (a0)+
  247.     bne    getfilename25
  248.     bra    getfilename3
  249.  
  250.  
  251. ;----------------------------------------------------------------
  252. ;    致命的エラーによるアボート処理
  253. ;----------------------------------------------------------------
  254.  
  255. ;----------------------------------------------------------------
  256. ;    使用メモリ量が足りるかをチェックする
  257. ;    in :---
  258. ;    out:---(メモリ不足ならプログラムを中断する)
  259. memcheck::
  260.     move.l    d0,-(sp)
  261.     move.l    (MEMLIMIT,a6),d0
  262.     cmp.l    (TEMPPTR,a6),d0
  263.     bcs    nomemabort
  264.     move.l    (sp)+,d0
  265.     rts
  266.  
  267. ;----------------------------------------------------------------
  268. ;    メモリ不足
  269. nomemabort::
  270.     lea.l    (nomem_msg,pc),a0
  271.     bra    abort
  272.  
  273. ;----------------------------------------------------------------
  274. ;    書き込みに失敗
  275. devfulabort::
  276.     lea.l    (devful_msg,pc),a0
  277.     bra    abort
  278.  
  279. ;----------------------------------------------------------------
  280. ;    外部シンボルの数が32767を超えた
  281. toomanyexabort::
  282.     lea.l    (toomanyex_msg,pc),a0
  283.     bra    abort
  284.  
  285. ;----------------------------------------------------------------
  286. ;    テンポラリファイルオープンに失敗
  287. tmpopenabort::
  288.     lea.l    (temp_msg,pc),a0
  289.  
  290. ;----------------------------------------------------------------
  291. ;    ファイルオープンに失敗(a0=ファイル名へのポインタ)
  292. filopenabort::
  293.     bsr    printmsg
  294.     lea.l    (openerr_msg,pc),a0
  295. abort:                    ;プログラム中断
  296.     bsr    printmsg
  297.     DOS    _ALLCLOSE        ;全ファイルをクローズする
  298.     lea.l    (beep_msg,pc),a0
  299.     bsr    printmsg
  300.     move.w    #1,-(sp)
  301.     DOS    _EXIT2
  302.  
  303. nomem_msg:    mes    'Abort: メモリが不足しています'
  304.         .dc.b    CRLF,0
  305. devful_msg:    mes    'Abort: ディスクがいっぱいです'
  306.         .dc.b    CRLF,0
  307. toomanyex_msg:    mes    'Abort: 外部シンボルが多すぎます'
  308.         .dc.b    CRLF,0
  309. temp_msg:    mes    'テンポラリファイル'
  310.         .dc.b    0
  311. openerr_msg:    mes    'がオープンできません'
  312.         .dc.b    CRLF,0
  313. beep_msg::    .dc.b    BELL,0
  314.     .even
  315.  
  316.  
  317. ;----------------------------------------------------------------
  318. ;    数値→文字列変換
  319. ;----------------------------------------------------------------
  320.  
  321. ;----------------------------------------------------------------
  322. ;    d0.lを16進8桁の文字列に変換する
  323. ;    in :d0.l=変換する数値/a0=変換した文字列を格納するバッファ
  324. ;    out:a0=変換した文字列の最後を指す
  325. convhex8::
  326.     swap.w    d0
  327.     bsr    convhex4
  328.     swap.w    d0
  329.  
  330. ;----------------------------------------------------------------
  331. ;    d0.wを16進4桁の文字列に変換する
  332. ;    in :d0.l=変換する数値/a0=変換した文字列を格納するバッファ
  333. ;    out:a0=変換した文字列の最後を指す
  334. convhex4::
  335.     rol.w    #8,d0
  336.     bsr    convhex2
  337.     rol.w    #8,d0
  338.  
  339. ;----------------------------------------------------------------
  340. ;    d0.bを16進2桁の文字列に変換する
  341. ;    in :d0.l=変換する数値/a0=変換した文字列を格納するバッファ
  342. ;    out:a0=変換した文字列の最後を指す
  343. convhex2::
  344.     move.w    d0,-(sp)        ;8
  345.     lsr.w    #4,d0            ;14
  346.     bsr    convhex21        ;18+61
  347.     move.w    (sp),d0            ;8
  348.     bsr    convhex21        ;18+61
  349.     move.w    (sp)+,d0        ;8
  350.                     ;196
  351.     rts
  352.  
  353. convhex21:
  354.     and.w    #$0F,d0            ;8
  355.     add.w    #'0',d0            ;8
  356.     cmp.w    #'9',d0            ;8
  357.     bls    convhex22        ;8|10
  358.     addq.w    #7,d0            ;8|0
  359. convhex22:
  360.     move.b    d0,(a0)+        ;8
  361.     rts                ;16
  362.                     ;61
  363.  
  364. ;----------------------------------------------------------------
  365. ;    d0.lを10進文字列に変換する
  366. ;    in :d0.l=変換する数値/a0=変換した文字列を格納するバッファ
  367. ;       :d1.w=変換桁数(負の数ならゼロサプレスしない/0なら左詰め)
  368. ;    out:a0=変換した文字列の最後を指す
  369. convdec::
  370.     movem.l    d0-d3/a1-a2,-(sp)
  371.     moveq.l    #' ',d2
  372.     tst.w    d1
  373.     beq    convdec9        ;左詰め
  374.     bpl    convdec1
  375.     moveq.l    #'0',d2
  376.     neg.w    d1
  377. convdec1:
  378.     subq.w    #1,d1
  379.     move.w    d1,d3
  380. convdec2:                ;変換桁数だけスペースを確保
  381.     move.b    d2,(a0)+
  382.     dbra    d3,convdec2
  383.     link    a5,#-12
  384.     lea.l    (-12,a5),a1
  385.     clr.b    (a1)+
  386.     bsr    convdecs        ;左詰めで変換する
  387.     movea.l    a0,a2
  388. convdec3:                ;右端から桁数だけ格納してゆく
  389.     move.b    -(a1),d0
  390.     beq    convdec4
  391.     move.b    d0,-(a2)
  392.     dbra    d1,convdec3
  393. convdec4:
  394.     unlk    a5
  395.     movem.l    (sp)+,d0-d3/a1-a2
  396.     rts
  397.  
  398. convdec9:                ;左詰めの場合
  399.     movea.l    a0,a1
  400.     bsr    convdecs
  401.     movea.l    a1,a0
  402.     movem.l    (sp)+,d0-d3/a1-a2
  403.     rts
  404.  
  405. convdecs:                ;d0.lを(a1)から左詰めで変換する
  406.     lea.l    (dectable,pc),a2
  407. convdecs1:
  408.     move.l    (a2)+,d2
  409.     beq    convdecs9
  410.     cmp.l    d0,d2
  411.     bhi    convdecs1
  412. convdecs2:
  413.     moveq.l    #'0'-1,d3
  414. convdecs3:
  415.     addq.b    #1,d3
  416.     sub.l    d2,d0
  417.     bcc    convdecs3
  418.     move.b    d3,(a1)+
  419.     add.l    d2,d0
  420.     move.l    (a2)+,d2
  421.     bne    convdecs2
  422.     rts
  423.  
  424. convdecs9:
  425.     move.b    #'0',(a1)+
  426.     rts
  427.  
  428. dectable:                ;10進文字列変換用テーブル
  429.     .dc.l    1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1,0
  430.  
  431.  
  432. ;----------------------------------------------------------------
  433. ;    メッセージ出力
  434. ;----------------------------------------------------------------
  435.  
  436. ;----------------------------------------------------------------
  437. ;    標準エラー出力にメッセージを出力する
  438. ;    in :a0=表示文字列へのポインタ
  439. ;    out:---
  440. printmsg::
  441.     move.w    #STDERR,-(sp)
  442.     pea.l    (a0)
  443.     DOS    _FPUTS
  444.     addq.l    #6,sp
  445.     rts
  446.  
  447. ;----------------------------------------------------------------
  448. ;    標準出力・PRNファイルにメッセージを出力する
  449. ;    in :a0=表示文字列へのポインタ
  450. ;    out:---
  451. prnstdout::
  452.     tst.b    (MAKEPRN,a6)
  453.     beq    prnstdout1
  454.     tst.b    (ISPRNSTDOUT,a6)
  455.     bne    prnlout
  456.     bsr    prnlout
  457. prnstdout1:
  458.     move.l    d0,-(sp)
  459.     move.w    #STDOUT,-(sp)
  460.     pea.l    (a0)
  461.     DOS    _FPUTS
  462.     addq.l    #6,sp
  463.     move.l    (sp)+,d0
  464.     rts
  465.  
  466. ;----------------------------------------------------------------
  467. ;    PRNファイルにメッセージを出力する
  468. ;    in :a0=表示文字列へのポインタ
  469. ;    out:---
  470. prnlout::
  471.     tst.b    (NOPAGEFF,a6)
  472.     bne    prnlout1
  473.     bsr    prnpaging
  474. prnlout1:
  475.     move.l    d0,-(sp)
  476.     move.w    (PRNHANDLE,a6),-(sp)
  477.     pea.l    (a0)
  478.     DOS    _FPUTS
  479.     addq.l    #6,sp
  480.     tst.l    d0
  481.     beq    prnlout9
  482. prnlout2:
  483.     move.l    (sp)+,d0
  484.     rts
  485.  
  486. prnlout9:
  487.     tst.b    (a0)
  488.     beq    prnlout2
  489.     bra    devfulabort
  490.  
  491. ;----------------------------------------------------------------
  492. ;    PRNファイルの改ページを行なう
  493. ;    in :d0.w=改ページのみなら0/メインページを増やすなら1/シンボルページなら-1
  494. ;    out:---
  495. prnnextpage::
  496.     tst.w    d0
  497.     beq    prnnextpage9
  498.     bmi    prnnextpage1
  499.     addq.w    #1,(PRNMPAGE,a6)
  500.     bra    prnnextpage2
  501.  
  502. prnnextpage1:
  503.     clr.w    (PRNMPAGE,a6)
  504. prnnextpage2:
  505.     clr.w    (PRNSPAGE,a6)
  506. prnnextpage9:
  507.     move.w    #1,(PRNCOUNT,a6)
  508.     rts
  509.  
  510. ;----------------------------------------------------------------
  511. ;    必要ならPRNファイルのページングを行なう
  512. ;    in :---
  513. ;    out:---
  514. prnpaging:
  515.     subq.w    #1,(PRNCOUNT,a6)
  516.     bcs    prnpaging1
  517.     bne    prnpaging9
  518.     move.l    a0,-(sp)
  519.     lea.l    (pageff_msg,pc),a0
  520.     bsr    prnlout1        ;改ページコードを出力
  521.     movea.l    (sp)+,a0
  522. prnpaging1:
  523.     link    a5,#-80
  524.     movem.l    d0-d1/a0-a1,-(sp)
  525.     addq.w    #1,(PRNSPAGE,a6)
  526.     move.w    (PRNPAGEL,a6),d0
  527.     subq.w    #4,d0
  528.     move.w    d0,(PRNCOUNT,a6)
  529.     lea.l    (title_msg,pc),a0
  530.     bsr    prnlout1        ;タイトル行を出力
  531.     movea.l    (PRNTITLE,a6),a1
  532.     bsr    tfrtitle
  533.     lea.l    (PRNDATE,a6),a1
  534.     bsr    strcpy
  535.     lea.l    (crlf_msg,pc),a1
  536.     bsr    strcpy
  537.     lea.l    (-80,a5),a0
  538.     bsr    prnlout1        ;タイトル文字列・日時を表示
  539.     movea.l    (PRNSUBTTL,a6),a1
  540.     bsr    tfrtitle
  541.     move.w    (PRNMPAGE,a6),d0
  542.     beq    prnpaging2
  543.     lea.l    (page_msg,pc),a1
  544.     bsr    strcpy
  545.     ext.l    d0
  546.     moveq.l    #0,d1            ;(左詰め)
  547.     bsr    convdec
  548.     move.b    #'-',(a0)+
  549.     bra    prnpaging3
  550.  
  551. prnpaging2
  552.     lea.l    (sym_msg,pc),a1
  553.     bsr    strcpy
  554. prnpaging3:
  555.     move.w    (PRNSPAGE,a6),d0
  556.     ext.l    d0
  557.     moveq.l    #0,d1            ;(左詰め)
  558.     bsr    convdec
  559.     lea.l    (crlf_msg,pc),a1
  560.     bsr    strcpy
  561.     lea.l    (-80,a5),a0
  562.     bsr    prnlout1        ;サブタイトル文字列・ページ数を表示
  563.     lea.l    (crlf_msg,pc),a0
  564.     bsr    prnlout1
  565.     cmpi.w    #1,(PRNSPAGE,a6)
  566.     bne    prnpaging4
  567.     tst.w    (PRNMPAGE,a6)
  568.     beq    prnpaging4
  569.     bsr    prnlout1
  570.     subq.w    #1,(PRNCOUNT,a6)
  571. prnpaging4:
  572.     movem.l    (sp)+,d0-d1/a0-a1
  573.     unlk    a5
  574. prnpaging9:
  575.     rts
  576.  
  577. tfrtitle:
  578.     lea.l    (-80,a5),a0
  579.     moveq.l    #56-1,d0
  580. tfrtitle1:
  581.     move.b    (a1)+,(a0)+
  582.     dbeq    d0,tfrtitle1
  583.     bne    tfrtitle9
  584.     subq.l    #1,a0
  585. tfrtitle2:
  586.     move.b    #' ',(a0)+
  587.     dbra    d0,tfrtitle2
  588. tfrtitle9:
  589.     move.b    #' ',(a0)+
  590.     move.b    #' ',(a0)+
  591.     rts
  592.  
  593. pageff_msg::    .dc.b    FF,0
  594. page_msg:    .dc.b    'Page ',0
  595. sym_msg:    .dc.b    'Symbols-',0
  596. month_name:    .dc.b    'JanFebMarAprMayJunJulAugSepOctNovDec'
  597.     .even
  598.  
  599. ;----------------------------------------------------------------
  600. ;    PRNファイルページング用の日時文字列を作成する
  601. ;    in :---
  602. ;    out:---
  603. makeprndate::
  604.     DOS    _GETDATE
  605.     move.l    d0,(ASSEMBLEDATE,a6)    ;(曜日(0=日)<<16)+((年-1980)<<9)+(月<<5)+日
  606.     DOS    _GETTIM2
  607.     move.l    d0,(ASSEMBLETIM2,a6)    ;(時<<16)+(分<<8)+秒
  608.  
  609.     lea.l    (PRNDATE,a6),a0
  610.     move.l    (ASSEMBLEDATE,a6),d0
  611.     move.w    d0,d2
  612.     lsr.w    #5,d0
  613.     and.w    #$0F,d0            ;月
  614.     mulu.w    #3,d0
  615.     lea.l    (month_name-3,pc,d0.w),a1
  616.     move.b    (a1)+,(a0)+
  617.     move.b    (a1)+,(a0)+
  618.     move.b    (a1)+,(a0)+
  619.     move.b    #'/',(a0)+
  620.     move.w    d2,d0
  621.     and.w    #$1F,d0            ;日
  622.     bsr    makeprndec
  623.     move.b    #'/',(a0)+
  624.     move.w    d2,d0
  625.     rol.w    #7,d0
  626.     and.w    #$7F,d0            ;年
  627.     add.w    #1980,d0
  628.     bsr    makeprndec
  629.     move.b    #' ',(a0)+
  630.     move.l    (ASSEMBLETIM2,a6),d0
  631.     move.w    d0,d2
  632.     swap.w    d0
  633.     and.w    #$1F,d0            ;時
  634.     bsr    makeprndec
  635.     move.b    #':',(a0)+
  636.     move.w    d2,d0
  637.     lsr.w    #8,d0
  638.     and.w    #$3F,d0            ;分
  639.     bsr    makeprndec
  640.     move.b    #':',(a0)+
  641.     move.w    d2,d0
  642.     and.w    #$3F,d0            ;秒
  643.     bsr    makeprndec
  644.     clr.b    (a0)
  645.     rts
  646.  
  647. makeprndec:                ;d0.wを10進2桁の文字列に変換する
  648.     ext.l    d0
  649.     moveq.l    #-2,d1            ;(2桁でゼロサプレスしない)
  650.     bra    convdec
  651.  
  652. crlf_msg:    .dc.b    CR,LF,0
  653.     .even
  654.  
  655. ;----------------------------------------------------------------
  656. ;    浮動小数点データ長を得る
  657. ;    in :d0.b=データ型
  658. ;    out:d1.w=データ長(ロングワードで)-1
  659. getfplen::
  660.     ext.w    d0
  661.     bpl    getfplen1
  662.     moveq.l    #SZ_EXTEND,d0        ;サイズ省略時は.x
  663. getfplen1:
  664.     moveq.l    #0,d1
  665.     move.b    (fsize_tbl,pc,d0.w),d1
  666.     rts
  667.  
  668. fsize_tbl:
  669.     .dc.b    -1,-1,-1        ;(.b/.w/.l)
  670.     .dc.b    (1-1),(2-1),(3-1),(3-1)    ;.s/.d/.x/.p
  671.     .even
  672.  
  673.  
  674. ;----------------------------------------------------------------
  675.     .end
  676.  
  677. ;----------------------------------------------------------------
  678. ;    $Log: misc.s,v $
  679. ;    Revision 2.1  1999 10/ 8(Fri) 21:50:20 M.Kamada
  680. ;    +86 改行コードの変更に対応
  681. ;    +86 EUC対応準備
  682. ;
  683. ;    Revision 2.0  1999  3/ 2(Tue) 20:19:49 M.Kamada
  684. ;    +82 skiphasspcを廃止
  685. ;
  686. ;    Revision 1.9  1999  2/27(Sat) 23:43:05 M.Kamada
  687. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  688. ;
  689. ;    Revision 1.8  1999  2/24(Wed) 19:44:39 M.Kamada
  690. ;    +80 .offsym <初期値>,<シンボル>
  691. ;
  692. ;    Revision 1.7  1998  7/14(Tue) 02:03:58 M.Kamada
  693. ;    +69 getfplenが奇数アドレスにあった
  694. ;
  695. ;    Revision 1.6  1998  5/25(Mon) 01:58:08 M.Kamada
  696. ;    +66 encode.sからmisc.s内のgetfplenが届かない
  697. ;
  698. ;    Revision 1.5  1998  5/14(Thu) 16:03:12 M.Kamada
  699. ;    +65 hasでアセンブルできなかった
  700. ;
  701. ;    Revision 1.4  1997 10/29(Wed) 21:23:10 M.Kamada
  702. ;    +52 crlf_msgを内蔵
  703. ;
  704. ;    Revision 1.3  1997  9/14(Sun) 16:06:33 M.Kamada
  705. ;    +45 数値→16進文字列変換を高速化
  706. ;
  707. ;    Revision 1.2  1997  6/25(Wed) 02:35:32 M.Kamada
  708. ;    +34 プレデファインシンボル__DATE__,__TIME__に対応する
  709. ;    +37 -up,-dpでプレデファインシンボルの禁止,許可
  710. ;
  711. ;    Revision 1.1  1994/02/16  15:44:18  nakamura
  712. ;    Initial revision
  713. ;
  714. ;
  715.